home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 26 / AMIGAplus Sonderheft 26 (2000)(Falke)(DE)(Track 1 of 2)[!].iso / Updates / HD-Installer / -WHDLoad- / WHDLoad_dev / Patcher1.05dev.lha / Patcher1.05 / PARAMQTX / encounter.imager.asm next >
Assembly Source File  |  1998-01-17  |  9KB  |  452 lines

  1. ;simple example of an imager for a hd-install
  2. ;use this as base to write your own imagers
  3.  
  4.  
  5.     INCDIR    ASM-ONE:INCLUDE2.0/
  6.  
  7.     INCLUDE    OWN/Patcher.I
  8.     INCLUDE    DEVICES/TRACKDISK.I
  9.     INCLUDE    EXEC/EXEC_LIB.I
  10.     INCLUDE    EXEC/IO.I
  11.     INCLUDE    LIBRARIES/DOS_LIB.I
  12.  
  13.  
  14. HP    MOVEQ.L    #20,D0
  15.     RTS
  16.     DC.L    TAB
  17.     DC.B    'PTCH'
  18.     DC.B    '$VER:Encounter_Diskimager_V1.00',0
  19.     EVEN
  20.  
  21. TAB    DC.L    PCH_INIT,INITROUT
  22.     DC.L    PCH_FILECOUNT,1
  23.     DC.L    PCH_ADAPTOR,ADNAME
  24.     DC.L    PCH_DISKNAME,DISKNAMEARRAY
  25.     DC.L    PCH_FILENAME,FILENAMEARRAY
  26.     DC.L    PCH_NAME,PARAMNAME
  27.     DC.L    PCH_DATALENGTH,LENGTHTABLE
  28.     DC.L    PCH_SPECIAL,SPECIALARRAY
  29.     DC.L    PCH_STATE,STATEARRAY
  30.     DC.L    PCH_STATE2,STATEARRAY2
  31.     DC.L    PCH_MINVERSION,VERSNAME        ;minimum version of THE PATCHER
  32.     DC.L    0
  33.  
  34. TRACKLENGTH=$1800
  35.  
  36.  
  37. ;minimum version of the patcher required, its a commandline-parameter
  38. VERSNAME    DC.B    'V1.05'        ;MAY NOT CONTAIN HEADING ZEROES
  39.     EVEN                ;MUST CONTAIN 2 NUMBERS AFTER POINT
  40.  
  41.  
  42. ;name of the adaptor
  43. ADNAME    DC.B    'Done by Harry.',0
  44.     EVEN
  45.  
  46. PARAMNAME    DC.B    'Encounter, Diskimager for HD-Install',0
  47.     EVEN
  48.  
  49. ;name(s) of the volume to save on
  50. DISKNAMEARRAY    DC.L    DISK1NAME
  51.  
  52. DISK1NAME    DC.B    'Encounter',0
  53.     EVEN
  54.  
  55. ;name of the file(s) to save
  56. FILENAMEARRAY    DC.L    FILE1NAME
  57.  
  58. FILE1NAME    DC.B    'disk.1',0
  59.     EVEN
  60.  
  61. ;table of the length(s) of the file
  62. LENGTHTABLE    DC.L    $4D*TRACKLENGTH
  63.     
  64. ;the parameter-initializing opens sourcedevice 
  65. INITROUT    
  66.     MOVEQ.L    #0,D0
  67.     MOVE.L    PTB_OPENDEVICE(A5),A0
  68.     JSR    (A0)
  69.     TST.L    D0
  70.     RTS
  71.  
  72. ;loading-statetext(s) for the cycles
  73. STATEARRAY    DC.L    LOADSTATE
  74.  
  75. ;save-statetext(s) for the cycles
  76. STATEARRAY2    DC.L    SAVESTATE
  77.  
  78. LOADSTATE
  79.     DC.B    'Please insert your original writepro-',$A
  80.     DC.B    'tected disk in the source drive.',0
  81.     EVEN
  82. SAVESTATE
  83.     DC.B    'Please insert your destination disk.',0
  84.     EVEN
  85.  
  86.  
  87. ;routines to 'load' something
  88. SPECIALARRAY    DC.L    LOADROUT        ;load stuff from original
  89.  
  90. LOADROUT
  91. ;.xxx    bra.s    .xxx
  92.     MOVEQ.L    #0,D7                ;one diskchange allowed
  93.     MOVEQ.L    #0,D0
  94.     MOVE.L    PTB_INHIBITDRIVE(A5),A0
  95.     JSR    (A0)
  96. .NEU
  97. .4    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;disk in sourcedrive?
  98.     MOVE.W    #TD_CHANGESTATE,IO_COMMAND(A1)
  99.     MOVE.L    (_SYSBASE).W,A6
  100.     JSR    _LVODOIO(A6)
  101.     TST.L    IO_ACTUAL(A1)
  102.     BNE.W    .NOTORG
  103.  
  104.     MOVE.L    PTB_ADDRESSOFFILE(A5),A4    ;load first part of disk
  105.     LEA.L    (A4),A2                ;offset to load in the dataspace
  106.     MOVEQ.L    #1,D2
  107.     MOVEQ.L    #0,D4                ;data from the start of the track
  108.  
  109.     MOVE.L    PTB_FILESIZE(A5),D3        ;bytes to read
  110.     bra.s    .5                ;because reading starts with
  111.                         ;trackstart, this is obsolete
  112.  
  113. .3    TST.L    D4
  114.     BNE.W    .1
  115. .5    MOVEQ.L    #$4,D5                ;4 tries, then error
  116.  
  117.     MOVE.L    D2,D0                ;display track to read from
  118.     ADD.L    D0,D0                ;one-sided disk!
  119.     BSR.W    TRACKREADING
  120.  
  121.  
  122. .55    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1
  123.     MOVE.L    PTB_SPACE(A5),IO_DATA(A1)    ;track is to load in PTB_SPACE
  124.     MOVE.L    #$7C00,IO_LENGTH(A1)        ;double length of track
  125.                         ;to decode the index-sync-read data
  126.     MOVE.L    D2,D0                ;my own trackcounter
  127.     ADD.L    D0,D0                ;one-sided disk!
  128.                     ;just a note: sometimes there are the 
  129.                     ;sides exchanged, then eor.w #1,d0 here
  130.     MOVE.L    D0,IO_OFFSET(A1)
  131.     MOVE.W    #TD_RAWREAD,IO_COMMAND(A1)
  132.     MOVE.B    #IOTDB_INDEXSYNC,IO_FLAGS(A1)
  133.     MOVE.L    (_SYSBASE).W,A6
  134.     JSR    _LVODOIO(A6)
  135.     TST.L    D0
  136.     BNE.W    .NXCYCLE
  137.     MOVE.L    PTB_SPACE(A5),A0        ;begin of raw track
  138.     LEA.L    $7C00(A0),A1            ;end of raw track=start of 
  139.     LEA.L    $7C00(A0),A3            ;decoded track
  140.     BSR.W    TRACKDECODE
  141.     TST.L    D0
  142.     BEQ.S    .R1OK
  143. .NXCYCLE
  144.     DBF    D5,.55
  145.  
  146.     ifeq    1
  147.     MOVE.L    A3,A1            ;FOR ME, THAT I SEE WRONG TRACKS
  148.     MOVE.W    #$2000-1,D0        ;INSTEAD OF ABANDONING AT THE
  149. .NEX    MOVE.B    #'N',(A1)+        ;TESTIMAGING
  150.     DBF    D0,.NEX
  151.     BRA.W    .R1OK
  152.     endc
  153.  
  154.     TST.L    D7                ;if disk has already been
  155.     BNE.W    .DISPERR            ;recognized: read error
  156.     BRA.W    .NOTORG
  157.  
  158. .R1OK
  159.                     ;the format is that unusual that
  160.                     ;i didnt check for a special
  161.                     ;value - thats also better if theres
  162.                     ;another version of that game
  163.                     ;but on dos-disks i recommend a check
  164.  
  165.     ST    D7            ;correct disk - nothing anymore
  166.                     ;to change
  167.  
  168.     ADDQ.L    #1,D2            ;increment tracknumber for next read
  169.  
  170.  
  171. .1                    
  172.     MOVE.B    (A3,D4.W),(A2)+
  173.     ADDQ.L    #1,D4
  174.     CMP.L    #TRACKLENGTH,D4            ;tracklength
  175.     BNE.S    .2
  176.     MOVEQ.L    #0,D4                ;new track
  177. .2    SUBQ.L    #1,D3
  178.     BNE.W    .3
  179.  
  180.     MOVEQ.L    #0,D0                ;display track to read from
  181.     BSR.W    TRACKREADING
  182.  
  183.     MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;load bootblock in an unused
  184.     MOVE.L    PTB_ADDRESSOFFILE(A5),A0    ;space of the image at $8c00
  185.     ADD.L    #$8C00,A0
  186.     MOVE.L    A0,IO_DATA(A1)
  187.     MOVE.L    #$400,IO_LENGTH(A1)
  188.     MOVE.L    #$00,IO_OFFSET(A1)
  189.     MOVE.W    #CMD_READ,IO_COMMAND(A1)
  190.     CLR.L    IOTD_SECLABEL(A1)
  191.     MOVE.L    (_SYSBASE).W,A6
  192.     JSR    _LVODOIO(A6)
  193.     TST.L    D0
  194.     BNE.W    .ERR
  195.  
  196.     MOVEQ.L    #0,D4                ;all went ok
  197.  
  198. .END    MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;switch motor off
  199.     MOVE.L    #0,IO_LENGTH(A1)
  200.     MOVE.W    #TD_MOTOR,IO_COMMAND(A1)
  201.     MOVE.L    (_SYSBASE).W,A6
  202.     JSR    _LVODOIO(A6)
  203. ;    TST.L    D4                ;obsolete, because only 1 cycle
  204. ;    BEQ.S    .SK
  205.     MOVEQ.L    #0,D0                ;enable drive again
  206.     MOVE.L    PTB_ENABLEDRIVE(A5),A0
  207.     JSR    (A0)
  208.  
  209. .SK    MOVE.L    D4,D0
  210.     RTS
  211.  
  212. .ERR    MOVEQ.L    #-1,D4
  213.     BRA.S    .END
  214.  
  215. .NOTORG    TST.L    D7            ;if the first time the original
  216.     BNE.S    .ERR            ;was not in the source drive,
  217.     ST    D7            ;youll be asked to put it there
  218.  
  219.     LEA.L    LOADSTATE(PC),A0    ;display 'please insert...'
  220.     MOVE.L    PTB_DISPLAY(A5),A6
  221.     JSR    (A6)
  222.  
  223.     MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;switch motor off
  224.     MOVE.L    #0,IO_LENGTH(A1)
  225.     MOVE.W    #TD_MOTOR,IO_COMMAND(A1)
  226.     MOVE.L    (_SYSBASE).W,A6
  227.     JSR    _LVODOIO(A6)
  228.  
  229.     LEA.L    LINE1(PC),A0        ;requester 'please insert...'
  230.     LEA.L    LINE2(PC),A1
  231.     MOVE.L    PTB_REQUEST(A5),A6
  232.     JSR    (A6)
  233.     TST.L    D0
  234.     BNE.S    .ERR
  235.     BRA.W    .NEU
  236.  
  237. .DISPERR
  238.     MOVE.L    PTB_DEVICESOURCEPTR(A5),A1    ;motor off
  239.     MOVE.L    #0,IO_LENGTH(A1)
  240.     MOVE.W    #TD_MOTOR,IO_COMMAND(A1)
  241.     MOVE.L    (_SYSBASE).W,A6
  242.     JSR    _LVODOIO(A6)
  243.     BSR.S    TRACKERROR        ;requester 'error on track 000'
  244.     BRA.S    .ERR
  245.  
  246. TRACKERROR                ;requester 'error on track 000'
  247.     MOVE.B    D2,D0
  248.  
  249.     ADD.B    D0,D0            ;one-sided disk
  250.  
  251.     AND.L    #$FF,D0
  252.     DIVU.W    #$A,D0
  253.     SWAP    D0
  254.     ADD.B    #$30,D0
  255.     MOVE.B    D0,ETRACK+2
  256.     CLR.W    D0
  257.     SWAP    D0
  258.     DIVU.W    #$A,D0
  259.     SWAP    D0
  260.     ADD.B    #$30,D0
  261.     MOVE.B    D0,ETRACK+1
  262.     CLR.W    D0
  263.     SWAP    D0
  264.     DIVU.W    #$A,D0
  265.     SWAP    D0
  266.     ADD.B    #$30,D0
  267.     MOVE.B    D0,ETRACK
  268.  
  269.     LEA.L    LINEE1(PC),A0
  270.     LEA.L    LINEE2(PC),A1
  271.     MOVE.L    PTB_REQUEST(A5),A6
  272.     JSR    (A6)
  273.     RTS
  274.  
  275.  
  276. TRACKREADING                ;message 'reading track 000'
  277.     AND.L    #$FF,D0
  278.     DIVU.W    #$A,D0
  279.     SWAP    D0
  280.     ADD.B    #$30,D0
  281.     MOVE.B    D0,RTRACK+2
  282.     CLR.W    D0
  283.     SWAP    D0
  284.     DIVU.W    #$A,D0
  285.     SWAP    D0
  286.     ADD.B    #$30,D0
  287.     MOVE.B    D0,RTRACK+1
  288.     CLR.W    D0
  289.     SWAP    D0
  290.     DIVU.W    #$A,D0
  291.     SWAP    D0
  292.     ADD.B    #$30,D0
  293.     MOVE.B    D0,RTRACK
  294.  
  295.     LEA.L    READINGNR(PC),A0
  296.     MOVE.L    PTB_DISPLAY(A5),A6
  297.     JSR    (A6)
  298.     RTS
  299.  
  300.  
  301.  
  302.  
  303. LINEE1    DC.B    'Read Error',0
  304.     EVEN
  305. LINEE2    dc.b    'on Track '
  306. ETRACK    DC.B    '000',0
  307.     EVEN
  308.  
  309. READINGNR
  310.     DC.B    'Reading track '
  311. RTRACK    DC.B    '000.',0
  312.     EVEN
  313.  
  314.  
  315. LINE1    DC.B    'Please insert your original',0
  316.     EVEN
  317. LINE2    DC.B    'disk in the source drive.',0
  318.     EVEN
  319.  
  320.  
  321.  
  322.  
  323. ;< A0 RAWTRACK
  324. ;< A1 TRACKBUFFER
  325. ;> D0 ERROR
  326.  
  327. SYNC    DC.W    $A89A
  328.  
  329. GETSYNC
  330. ;SYNCANFANG SUCHEN
  331.     MOVE.W    SYNC(PC),D1        ;find sync in the bitstream, skip 
  332. .SHF2    MOVEQ.L    #$10-1,D5        ;all syncwords and return 
  333. .SHF1    MOVE.L    (A2),D0            ;position: word (in A2)+bitshift (in D5)
  334.     LSR.L    D5,D0
  335.     CMP.W    D1,D0
  336.     BEQ.S    .SY
  337.     DBF    D5,.SHF1
  338.     ADDQ.L    #2,A2
  339.     CMP.L    A2,A4
  340.     BHI.S    .SHF2
  341.     BRA.S    .ERR
  342. .SY    
  343.  
  344. .1    MOVE.L    (A2),D0
  345.     ADDQ.L    #2,A2
  346.     LSR.L    D5,D0
  347.     CMP.W    D1,D0
  348.     BEQ.S    .1
  349.     SUBQ.L    #2,A2
  350.     CMP.L    A2,A4
  351.     BLS.S    .ERR
  352.     MOVEQ.L    #0,D0
  353.     RTS
  354.  
  355. .ERR    MOVEQ.L    #-1,D0
  356.     RTS
  357.  
  358. ;COMMENT: a trackdecoderoutine is heavily based on the routine
  359. ;of the original, take it, remove all crap, set syncfinding on
  360. ;my provided routine and change the reads of words and longwords 
  361. ;in reads from the bitstream, often its also necessary to change
  362. ;the use of registers (eg move use of D5 to D7) - if thats not possible
  363. ;store the bitshift somewhere - either An or memory (slow) - see nitro-imager
  364.  
  365.  
  366. DEC1B
  367. DECODE1BYTE
  368. ;    MOVE.W    (A2)+,D0        ;original code
  369.  
  370.     MOVE.L    (A2),D0            ;my code for getting a word
  371.     ADDQ.L    #2,A2            ;from the bitstream
  372.     LSR.L    D5,D0            ;my code ends
  373.                     ;the code for getting a longword
  374.                     ;can be found in the nitro-imager
  375.  
  376.     AND.L    D6,D0    
  377.     MOVEQ.L    #$8-1,D2
  378. .1    LSL.W    #2,D0
  379.     ROXL.B    #1,D1    
  380.     DBF    D2,.1
  381.     MOVE.B    D1,D0
  382.     RTS
  383.  
  384.  
  385. ;< A0 RAWTRACK
  386. ;< A1 TRACKBUFFER
  387. ;> D0 ERROR
  388. ;INTERN
  389. ;  D5 SHIFT
  390.  
  391.  
  392. TRACKDECODE    MOVEM.L    A2/A3/A4/A5/D1/D2/D3/D4/D5/D6/D7,-(A7)
  393.  
  394.     MOVE.L    A0,A2
  395.     LEA.L    ($7B80-TRACKLENGTH*2)(A0),A4    ;LAST CHANCE FOR CORRECT SYNC 
  396.                     ;(READ LENGTH -$80 SAFETY 
  397.                     ;-LENGTH OF A RAW TRACK OR SECTOR)
  398. .ANF
  399.     MOVE.L    A1,A3
  400.     MOVE.L    #$55555555,D6
  401.     BSR.W    GETSYNC
  402.     TST.L    D0
  403.     BNE.W    .ERR
  404.  
  405.     MOVE.W    #$1820,D4        ;DECODE TRACK AND HEADER
  406.     LEA.L    $2000(A1),A3        ;due the unusual softsync i had to
  407. .1    BSR.S    DEC1B            ;decode the track not directly in
  408.     MOVE.B    D0,(A3)+        ;the trackbuffer but in an extra space
  409.     DBF    D4,.1            ;(remember: you got total $c000 space)
  410.  
  411.     LEA.L    $2000(A1),A3        ;SEARCH SOFTSYNC
  412.     MOVEQ.L    #20,D0
  413.     MOVEQ.L    #-1,D1
  414. .2    MOVE.B    (A3)+,D1
  415.     CMP.L    #$12345678,D1
  416.     BEQ.S    .SSYNC
  417.     LSL.L    #8,D1
  418.     DBF    D0,.2
  419.     BRA.S    .ERR
  420.  
  421.  
  422. .SSYNC    TST.B    (A3)+            ;SKIP TRACKNUMBER
  423.  
  424.     MOVE.L    A1,A2            ;NOW YOU HAVE THE DATASTART, MOVE IT
  425.                     ;TO THE REAL DECODE-TRACKBUFFER
  426.     MOVE.W    #TRACKLENGTH+2-1,D4    ;MOVE TRACKDATA, CHECKSUM INCLUDED (2)
  427. .3    MOVE.B    (A3)+,(A2)+
  428.     DBF    D4,.3
  429.  
  430.     MOVE.L    A1,A3
  431.     MOVE.W    #TRACKLENGTH-1,D4    ;EVALUATE CHECKSUM
  432.     MOVEQ.L    #0,D1
  433. .4    ADD.B    (A3)+,D1
  434.     ROL.W    #1,D1
  435.     DBF    D4,.4
  436.  
  437.     MOVE.B    (A3)+,D0        ;COMPARE WITH TRACKCHECKSUM
  438.     LSL.W    #8,D0
  439.     MOVE.B    (A3)+,D0
  440.     ROL.W    #8,D0
  441.     CMP.W    D0,D1
  442.     BNE.S    .ERR
  443.  
  444.     MOVEQ.L    #0,D0
  445. .END
  446.     MOVEM.L    (A7)+,A2/A3/A4/A5/D1/D2/D3/D4/D5/D6/D7
  447.     RTS
  448. .ERR
  449.     MOVEQ.L    #-1,D0
  450.     BRA.S    .END
  451.  
  452.